import sys, json, subprocess

from json.decoder import JSONDecodeError
from pygments.lexers import JsonLexer
from pygments import highlight, lexers, formatters

# 格式化json string
# 输出格式化的JSON字符串到命令行，并复制到粘贴板
def print_json_format_and_copy_to_clipboard(json_string):

   try:
      jData = json.loads(json_string)

      # 格式化、输出到命令行
      json_formatted = json.dumps(jData, indent=4, sort_keys=True, ensure_ascii=False)
      colorful_json = highlight(json_formatted, lexers.PythonLexer(), formatters.TerminalFormatter())
      print(colorful_json)

      # 再次写入粘贴板
      json_len = len(json_formatted)
      p = subprocess.Popen(['pbcopy'], stdin=subprocess.PIPE)
      if json_len <= 10*10000:
         p.stdin.write(bytes(json_formatted, encoding="utf8"))
      else:
         # 老Mac遇到100万字符以上的复制长时，paste app会卡死。所以这里限制10万以下才复制
         p.stdin.write(bytes(f'JSON文本内容过长({json_len})，如有需要，请手动复制', encoding="utf8"))
      p.stdin.close()
      p.communicate()

   except JSONDecodeError as e:
      print(f"{sys._getframe().f_code.co_name}(): JSON解码失败: error={e}\n\n{json_string}\n")